package com.example.myspringboot.util;

import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.StrUtil;
import com.example.myspringboot.anno.PadLeft;

import java.lang.reflect.Field;
import java.nio.charset.Charset;

/**
 * @author cy
 * @date 2024/1/29
 */
public class ComUItil {
    private ComUItil() {
    }

    /**
     * 将其对应的字节数组的指定长度范围内的字节转换为GBK编码的字符串并设置为字段的值
     *
     * @param obj   对象
     * @param clz   对象的类
     * @param bytes 字节数组
     * @throws IllegalAccessException 如果访问字段的权限被禁止
     */
    public static void fiexedLenToEntity(Object obj, Class clz, byte[] bytes, String charsetName) throws IllegalAccessException {
        // 获取类的所有字段
        Field[] fields = clz.getDeclaredFields();

        int cout = 0;

        // 遍历字段数组
        for (Field field : fields) {
            // 如果字段上有PadLeft注解
            if (field.isAnnotationPresent(PadLeft.class)) {
                // 获取注解上的长度
                PadLeft padLeft = field.getAnnotation(PadLeft.class);
                int len = padLeft.len();
                // 设置字段可访问
                field.setAccessible(true);
                // 截取字节数组的指定范围内的字节，并将截取的字节转换为GBK编码的字符串，并去除首尾空格
                field.set(obj, StrUtil.str(ArrayUtil.sub(bytes, cout, cout + len), Charset.forName(charsetName)).trim());
                // 设置字段不可访问
                field.setAccessible(false);
                // 更新字节数组偏移量
                cout += len;
            }
        }
    }

    /**
     * 检查字符串是否为空或仅包含空格。
     * 如果字符串为null或者经过trim处理后长度为0，则返回空字符串；否则返回原字符串。
     * 这个方法主要用于处理字符串为空的情况，确保后续操作不会因为空字符串引发异常。
     *
     * @param str 待检查的字符串
     * @return 如果输入字符串为空或仅包含空格，则返回空字符串；否则返回原字符串。
     */
    public static String ifNul(String str) {
        // 检查字符串是否为null或只包含空格
        if (str == null || str.trim().isEmpty()) {
            return "";
        }
        return str;
    }

}
